
package carmadness.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import carmadness.Game;
import carmadness.GameState;
import carmadness.model.Facade;
import carmadness.model.World;
import carmadness.view.GraphicFrontend;

/**
 * Grafikus felülethez tartozó controller.
 * 
 * @author arpi
 * @version 1.0
 * @created 10-Apr-2010 2:32:40 PM
 */
public class GraphicController extends Controller implements Runnable
{
	protected GraphicFrontend graphicFrontend;

	public GraphicController( GraphicFrontend _graphicFrontend )
	{
		graphicFrontend = _graphicFrontend;

		// Esménykezelők a grafikus felülethez
		// Ablakbezárás eseménye
		graphicFrontend.addWindowListener( new WindowAdapter()
			{
				public void windowClosing( WindowEvent event )
				{
					event.getWindow().dispose();
					System.exit( 0 );
				}
			} );

		// Új játék gomb eseménye
		graphicFrontend.getNewGameButton().addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent event )
				{
					Game.getInstance().setState( GameState.NewGame );
				}
			} );

		// Kilépés gomb eseménye
		graphicFrontend.getExitButton().addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent event )
				{
					System.exit( 0 );
				}
			} );

		// Gombnyomás esemény (rabló irányváltoztatása a gombnak megfelelően)
		graphicFrontend.getGameViewport().addKeyListener( new KeyAdapter()
			{
				public void keyPressed( KeyEvent e )
				{
					String newDir = null;

					switch ( e.getKeyCode() )
					{
					// Felfelé mutató nyíl
					case 38:
						newDir = "90";
						break;

					// Lefelé mutató nyíl
					case 40:
						newDir = "270";
						break;

					// Jobbra mutató nyíl
					case 39:
						newDir = "0";
						break;

					// Balra mutató nyíl
					case 37:
						newDir = "180";
						break;

					default:
						break;
					}

					if ( newDir != null )
					{
						Facade.getInstance().change_direction( "robber", newDir );
						Facade.getInstance().set_vehicleSpeed( "robber", "1" );
					}

				}
			} );

	}

	/**
	 * Fő metódus, az idő múlásáért, a modell frissítéséért, a rajzolásért felel
	 */
	public void run()
	{
		while ( true )
		{
			GameState gs = Game.getInstance().getState();

			switch ( gs )
			{
			case NewGame:
				return;
			case Playing:
				// Léptetés
				Facade.getInstance().step( "1" );

				// Világ rajzolása
				graphicFrontend.getGameViewport().repaint();

				// Életek kiírása
				graphicFrontend.getStatusLabel().setText( "Életek száma: " + String.valueOf( World.getInstance().getPlayer().getLives() ) );

				// Időzítés, várakozás a következő lépésre
				try
				{
					Thread.sleep( 200 );
				}
				catch ( InterruptedException e )
				{
					return;
				}
				break;

			case Lose:
				graphicFrontend.getStatusLabel().setText( "Vesztettél :-(" );
				break;

			case Win:
				graphicFrontend.getStatusLabel().setText( "Nyertél :-)" );
				break;
			}
		}

	}
}
